Zendeskチケットの添付ファイルを取得して、S3に保存してみた
はじめに
こんにちは、サービスグロースチームの筧です。
最近、Zendeskのチケットから添付ファイルを取得して、特定S3バケットに保存するPoCを作成しました。今回はこちらの内容について、ブログ向けに汎化してご紹介します。
構成図
デプロイ方法
devステージにデプロイする想定で進めます。
S3バケットの準備
添付ファイルの保存先のS3バケットを作成します。S3バケットは誤って削除したくないので、今回は手動で作成します。Amazon S3 マネージドキー (SSE-S3)を使ってサーバー側の暗号化を有効化にして、後はデフォルトで作成しました。
Zendesk APIの準備
APIリクエストを実行するには、認証済みのZendeskユーザーであることが必要です。APIリクエストは、メールアドレスとパスワード、メールアドレスとAPIトークン、またはOAuthアクセストークンでBasic認証を使用して認証します。
APIリクエストを認証するにはどうすればよいですか? | Zendesk
チケットを参照して、添付ファイルを取得するために、Zendesk APIの準備をします。今回はメールアドレスとAPIトークンで認証します。まずは認証済みのZendeskユーザーのメールアドレスを用意します。続いてAPIトークンを生成します。生成方法は以下を参照ください。
Zendeskサブドメイン情報も後で必要になるので確認します。確認方法は以下を参照ください。
Zendeskのサブドメインはどこで確認できますか? | Zendesk
Secrets Managerの準備
Secrets Managerにクレデンシャル情報や環境変数などを保存します。
- シークレットのタイプ:その他のシークレットのタイプ
- キー/値のペア
- token:{{APIトークン}}
- email: {{認証済みのZendeskユーザーのメールアドレス}}
- subdomain: {{Zendeskサブドメイン}}
- bucket: {{添付ファイルの保存先のS3バケット}}
- シークレットの名前: dev/blog-zendesk-fetch-attachments
その他AWSリソースのデプロイ
以下のリポジトリを利用して、その他のAWSリソースをデプロイします。デプロイにはServeless Frameworkを利用します。デプロイ方法はリポジトリのREADMEを参照ください。
blog-zendesk-fetch-attachments | GitHub
以下の階層構造で書いています。
- handlers層: エントリポイントを定義
- use_cases層: ビジネスロジックを定義
- services層: AWSサービスやZendeskなどのサービスを定義
コードの流れは以下です。
- state-machines.ymlに定義したAPI Gatewayのエンドポイントでリクエストを受け取り
- state-machines.ymlに定義したステートマシンが起動
- エントリポイントのsrc/handlers/fetch.handlerを呼び出し
- src/use_cases/fetch.execを呼び出し
- src/use_cases/fetch._init_use_caseを呼び出し
- src/use_cases/fetch._init_use_case内で、クレデンシャル情報や環境変数を取得
- src/use_cases/fetch._init_use_case内で、services層で定義したクラスのインスタンスを作成
- src/use_cases/fetch._init_use_caseで取得した情報をインプットに、use_cases層で定義しているクラス(FetchAttachmentsUseCase)のインスタンスを作成
- FetchAttachmentsUseCaseのインスタンスで、execメソッドを呼び出し
- チケットの最新コメントから添付ファイルを取得
- 添付ファイルをLambdaのtmpディレクトリに一時保存
- S3バケットにアップロード
- Lambdaのtmpディレクトリをクリア
ZendeskのWebhookとトリガーの設定
Webhookの設定
以下の通り設定します。
- 名前: dev/blog-zendesk-fetch-attachments
- エンドポイントURL: {{API Gatewayのエンドポイント}}
- リクエスト方法: POST
- リクエスト形式: JSON
- 認証: なし
トリガーの設定
トリガーの条件は環境にあわせて指定ください。トリガーのアクションには先程設定したWebhookへの通知を設定します。
{ "zendesk_id": "{{ticket.id}}" }
トリガーの条件は環境に合わせて設定ください。
動かしてみる
Zendeskチケットの作成
トリガーの条件に合致するZendeskチケットを作成します。今回は適当なスクリーンショットを添付してみました。
ステートマシンの確認
ステートマシンが起動して、実行ステータスが成功になっていればOKです。参考までに実行入力例は以下のようになっています。
{ "zendesk_id": "5125" }
グラフインスペクターでは以下のように表示されます。
S3バケットの確認
/バケット名/ZendeskチケットID//アタッチメントID
上記パスに対象のオブジェクトが作成されています。マネジメントコンソール上でオブジェクトをダウンロードして、Zendeskチケット作成時に添付したファイルであればOKです!
あとがき
最後まで読んでいただきありがとうございます。今回はPoCである都合上、カスタムドメインの設定やエンドポイントの認証などは割愛している点はご容赦ください。申請関連の処理で、チケットに申請書を添付いただくような場合に、当該サービスを活用することで、後続処理の自動化が期待できそうです!
それではまた!